package algorithm.middle;


import java.util.HashMap;
import java.util.Stack;

/**
 * @BelongsProject: LeetCode
 * @BelongsPackage: algorithm.middle
 * @Author: 江岸
 * @CreateTime: 2021-03-06 19:00
 * @Description: 给你两个 没有重复元素 的数组 nums1 和 nums2 ，其中nums1 是 nums2 的子集。
 *
 * 请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
 *
 * nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在，对应位置输出 -1 。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/next-greater-element-i
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class NextGreaterElement496 {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] arr = new int[nums1.length];
        for (int x=0;x<arr.length;x++){
            arr[x] = -1;
        }
        for (int i=0;i<nums1.length;i++){
            for (int j=0;j< nums2.length;j++){
                if (nums2[j] == nums1[i]){
                    int n = j;
                    while (n<nums2.length){
                        if (nums2[n]>nums2[j]){
                            arr[i] = nums2[n];
                            break;
                        }
                        n++;
                    }
                    break;
                }

            }
        }
        return arr;
    }

    //单调栈
    public int[] nextGreaterElement2(int[] nums1, int[] nums2) {
        //状态数组，记录nums2中每个元素后面一个最大元素的值
        int[] state = new int[nums2.length];
        //单调栈
        Stack<Integer> stack = new Stack<>();
        //记录数组2中每个元素对应的下标
        HashMap<Integer, Integer> index = new HashMap<>();
        //从后往前遍历
        for(int i=nums2.length-1;i>=0;i--){
            index.put(nums2[i],i);
            while(!stack.isEmpty() && nums2[i]>stack.peek()){
                stack.pop();
            }
            state[i] = stack.isEmpty()?-1:stack.peek();
            stack.push(nums2[i]);
        }
        for (int i=0;i<nums1.length;i++){
            nums1[i] = state[index.get(nums1[i])];
        }
        return nums1;
    }
}
